﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using Business;
using Entity;
using Entity.Custom;
using Newtonsoft.Json;
using Utilities;

namespace FreshCms.BackEnd.Handler
{
    /// <summary>
    /// Summary description for Category
    /// </summary>
    public class Category : IHttpHandler, System.Web.SessionState.IRequiresSessionState
    {
        #region Declare variable for check pms
        Int32 ui = 0;
        InPms chkPms = new InPms();
        InUser CurrentUser = new InUser();
        #endregion

        public void ProcessRequest(HttpContext context)
        {
            string m = "";
            var response = new ResponseData();

            #region Get PanelId and Check Psm
            CurrentUser = InUserBusiness.GetSessionInUser();
            if (!string.IsNullOrEmpty(context.Request["ui"]))
            {
                Int32.TryParse(context.Request["ui"], out ui);
                if (ui > 0)
                    chkPms = InPmsBusiness.CheckSessionPms(ui);
                if (chkPms == null)
                    chkPms = new InPms { PmsView = 0, PmsUpdate = 0, PmsDelete = 0 };
            }
            #endregion



            if (context.Request.RequestType == "POST")
            {
                if (context.Request["m"] != null)
                    m = context.Request["m"];
                else
                    return;
            }
            else
            {
                if (context.Request.QueryString["m"] != null)
                    m = context.Request.QueryString["m"];
                else
                    return;
            }

            switch (m.ToLower())
            {
                case "update":
                    response = UpdateCate(context);
                    break;
                case "delete":
                    response = DeleteCate(context);
                    break;
                case "order":
                    response = OrderCate(context);
                    break;
                case "publish":
                    response = PublishCate(context);
                    break;
                    
            }

            context.Response.ContentType = "application/x-javascript";

            string callBack = context.Request["callback"];
            if (!string.IsNullOrEmpty(callBack))
            {
                context.Response.Write(callBack + "( " + JsonConvert.SerializeObject(response) + " );");
            }
            else
                context.Response.Write(JsonConvert.SerializeObject(response));
        }

        private ResponseData UpdateCate(HttpContext context)
        {
            // Check Pms
            if (chkPms.PmsUpdate == 0)
                return new ResponseData { Data = null, ExtData = null, Message = Constant.PmsNoUpdate, Success = false };

            var response = new ResponseData();

            if (!string.IsNullOrEmpty(context.Request["name"])
                && !string.IsNullOrEmpty(context.Request["parent"])
                && !string.IsNullOrEmpty(context.Request["type"])
                && !string.IsNullOrEmpty(context.Request["stt"]))
            {
                Int32 cateid = 0;
                if (!string.IsNullOrEmpty(context.Request["id"]))
                    Int32.TryParse(context.Request["id"], out cateid);
                string catename = context.Request["name"];
                Int32 catestatus = 0;
                Int32.TryParse(context.Request["stt"], out catestatus);
                Int32 parent = 0;
                Int32.TryParse(context.Request["parent"], out parent);
                Int32 type = 0;
                Int32.TryParse(context.Request["type"], out type);

                var obj = new OutCategory
                {
                    CatId = cateid,
                    CatParentId = parent,
                    CatName = catename,
                    CatStatus = catestatus,
                    CatType = type
                };
                response.Data = OutCategoryBusiness.UpdateOutCategory(obj);
                response.Message = "Call Insert / Update OK";
                response.Success = true;

                if (cateid > 0)
                {
                    InLogBusiness.InsertInLog(new InLog
                    {
                        UserId = CurrentUser.UserId,
                        LogAction = 2,
                        Field1 = "Update danh mục thành công",
                        Field2 = "Danh mục được thay đổi thông tin: " + catename,
                        Field3 = "",
                        LogId = 0
                    });
                }
                else
                {
                    InLogBusiness.InsertInLog(new InLog
                    {
                        UserId = CurrentUser.UserId,
                        LogAction = 1,
                        Field1 = "Thêm danh mục mới thành công",
                        Field2 = "Tên danh mục mới: " + catename,
                        Field3 = "",
                        LogId = 0
                    });
                }

            }
            else
            {
                response.Data = -1;
                response.Message = "Param Name, Status not valid";
                response.Success = false;
            }

            return response;
        }

        private ResponseData DeleteCate(HttpContext context)
        {
            // Check Pms
            if (chkPms.PmsDelete == 0)
                return new ResponseData { Data = null, ExtData = null, Message = Constant.PmsNoDelete, Success = false };

            var response = new ResponseData();
            if (!string.IsNullOrEmpty(context.Request["id"])
                && !string.IsNullOrEmpty(context.Request["name"])
                && !string.IsNullOrEmpty(context.Request["type"]))
            {
                string catename = context.Request["name"];
                var cateid = 0;
                Int32.TryParse(context.Request["id"], out cateid);
                Int32 type = 0;
                Int32.TryParse(context.Request["type"], out type);

                if (cateid > 0)
                {
                    response.Data = OutCategoryBusiness.DeleteOutCategory(cateid, type);
                    response.Message = "Call Delete OK";
                    response.Success = true;
                    // log system 
                    InLogBusiness.InsertInLog(new InLog
                    {
                        UserId = CurrentUser.UserId,
                        LogAction = 0,
                        Field1 = "Xóa danh mục thành công",
                        Field2 = "Tên danh mục bị xóa: " + catename,
                        Field3 = "",
                        LogId = 0
                    });
                }
                else
                {
                    response.Data = cateid;
                    response.Message = "cateid <=0";
                    response.Success = false;
                }
            }
            else
            {
                response.Data = -1;
                response.Message = "Param not valid";
                response.Success = false;
            }
            return response;
        }

        private ResponseData OrderCate(HttpContext context)
        {
            // Check Pms
            if (chkPms.PmsUpdate == 0)
                return new ResponseData { Data = null, ExtData = null, Message = Constant.PmsNoUpdate, Success = false };

            var response = new ResponseData();

            if (!string.IsNullOrEmpty(context.Request["id"])
                && !string.IsNullOrEmpty(context.Request["parent"])
                && !string.IsNullOrEmpty(context.Request["type"])
                && !string.IsNullOrEmpty(context.Request["action"]))
            {
                Int32 cateid = 0;
                Int32.TryParse(context.Request["id"], out cateid);
                Int32 parent = 0;
                Int32.TryParse(context.Request["parent"], out parent);
                Int32 type = 0;
                Int32.TryParse(context.Request["type"], out type);
                Int32 action = 0;
                Int32.TryParse(context.Request["action"], out action);

                int returnVal = OutCategoryBusiness.OrderOutCategory(cateid, parent, type, action);

                if (returnVal > 0)
                {
                    response.Data = returnVal;
                    response.Message = "Call Order OK";
                    response.Success = true;
                    if (action == 0) // neu la order xuong duoi thanhcong thi ghi log he thong
                    {
                        InLogBusiness.InsertInLog(new InLog
                        {
                            UserId = CurrentUser.UserId,
                            LogAction = 3,
                            Field1 = "Sắp xếp danh mục thành công",
                            Field2 = "Danh mục được chuyển xuống có ID = " + cateid,
                            Field3 = "",
                            LogId = 0
                        });
                    }
                    else
                    {
                        InLogBusiness.InsertInLog(new InLog
                        {
                            UserId = CurrentUser.UserId,
                            LogAction = 3,
                            Field1 = "Sắp xếp danh mục thành công",
                            Field2 = "Danh mục được đưa lên có ID = " + cateid,
                            Field3 = "",
                            LogId = 0
                        });
                    }
                }
                else
                {
                    response.Data = returnVal;
                    if (action == 0) // neu la order xuong duoi khong thanh cong thi thong bao loi
                        response.Message = "Danh mục đã ở vị trí dưới cùng, không thể chuyển xuống được nữa.";
                    else
                        response.Message = "Danh mục đã ở vị trí trên cùng, không thể đưa lên được nữa.";
                    response.Success = false;
                }
            }
            else
            {
                response.Data = -1;
                response.Message = "Param Name, Status not valid";
                response.Success = false;
            }

            return response;
        }

        private ResponseData PublishCate(HttpContext context)
        {
            // Check Pms
            if (chkPms.PmsUpdate == 0)
                return new ResponseData { Data = null, ExtData = null, Message = Constant.PmsNoUpdate, Success = false };

            var response = new ResponseData();

            if (!string.IsNullOrEmpty(context.Request["type"]))
            {
                Int32 type = 0;
                Int32.TryParse(context.Request["type"], out type);

                var lstParent = OutCategoryBusiness.GetOutCategoryList(type, 1);

                foreach(OutCategory item in lstParent){
                    item.listChildCate = OutCategoryBusiness.GetOutCategoryChildList(item.CatId, 1);
                }

                response.Data = lstParent;
                response.Message = "Call Publish OK";
                response.Success = true;

                Utils.CreateFile(context.Server.MapPath("/")+ "FrontEnd\\listfiles\\cate_" + type.ToString() + ".js", "var cate_" + type.ToString() + " = '" + JsonConvert.SerializeObject(lstParent) + "';");

                if (type == 0)
                {
                    InLogBusiness.InsertInLog(new InLog
                    {
                        UserId = CurrentUser.UserId,
                        LogAction = 3,
                        Field1 = "Xuất bản danh mục sản phẩm thành công",
                        Field2 = "",
                        Field3 = "",
                        LogId = 0
                    });
                }
                else
                {
                    InLogBusiness.InsertInLog(new InLog
                    {
                        UserId = CurrentUser.UserId,
                        LogAction = 3,
                        Field1 = "Xuất bản danh mục tin tức thành công",
                        Field2 = "",
                        Field3 = "",
                        LogId = 0
                    });
                }
                
            }
            else
            {
                response.Data = -1;
                response.Message = "Param Name, Status not valid";
                response.Success = false;
            }

            return response;
        }

        public bool IsReusable
        {
            get
            {
                return false;
            }
        }
    }
}